package main

import "fmt"

/*
22_命令模式
概念：将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化，对请求排队或记录请求日志，以及支持可撤销的操作。
*/

type Command interface {
	Execute()
}

type MotherBoard struct {
}

func (m *MotherBoard) Start() {
	fmt.Println("程序启动中")
}

func (m *MotherBoard) ReBoot() {
	fmt.Println("程序重启中")
}

type StartBoard struct {
	mb *MotherBoard
}

func NewStartBoard(mb *MotherBoard) *StartBoard {
	return &StartBoard{mb: mb}
}

func (s *StartBoard) Execute() {
	s.mb.Start()
}

type ReBootBoard struct {
	mb *MotherBoard
}

func NewReBootBoard(mb *MotherBoard) *ReBootBoard {
	return &ReBootBoard{mb: mb}
}

func (r *ReBootBoard) Execute() {
	r.mb.ReBoot()
}

type Box struct {
	start  Command
	reboot Command
}

func NewBox(start Command, reboot Command) *Box {
	return &Box{start: start, reboot: reboot}
}

func (b *Box) PressStart() {
	b.start.Execute()
}

func (b *Box) PressReboot() {
	b.reboot.Execute()
}

func main() {
	board := &MotherBoard{}
	btn1 := NewStartBoard(board)
	btn2 := NewReBootBoard(board)
	box := NewBox(btn1, btn2)
	box.PressStart()
	box.PressReboot()
}
